##### My (demuredemeanor) i3 config
# Uses tabstop=4; shiftwidth=4 tabs; foldmarker={{{,}}};
# https://notabug.org/demure/dotfiles/
# legacy repo http://github.com/demure/dotfiles
# vim: set filetype=i3config:

## Set prefix to Super
set $mod Mod4

# Font for window titles. Will also be used by the bar unless a different font
# is used in the bar {} block below.
font pango:monospace 8

# This font is widely installed, provides lots of unicode glyphs, right-to-left
# text rendering and scalability on retina/hidpi displays (thanks to pango).
#font pango:DejaVu Sans Mono 8

## If you try to go to the same workspace you are on, jump to last workspace
##workspace_auto_back_and_forth yes

### Variables ### {{{
    set $Locker i3lock -e -c 2E3436 && sleep 1

    ### Workspace Names ### {{{
    set $ws1 1:
    set $ws2 2:
    set $ws3 3:
    set $ws4 4
    set $ws5 5
    set $ws6 6
    set $ws7 7
    set $ws8 8
    set $ws9 9
    set $ws10 10
    ### End Workspace Names ### }}}
### End Variables ### }}}

### Bindings ### {{{
    ### i3 Keys ### {{{
    ## reload the configuration file
    bindsym $mod+Shift+c reload
    ## restart i3 inplace (preserves your layout/session, can be used to upgrade i3)
    bindsym $mod+Shift+r exec i3-msg restart
    ## exit i3 (logs you out of your X session)
    bindsym $mod+Shift+e exec "i3-nagbar -t warning -m 'You pressed the exit shortcut. Do you really want to exit i3? This will end your X session.' -b 'Yes, exit i3' 'i3-msg exit'"
    ### End i3 Keys ### }}}

    ### Workspace Bindings ### {{{
        ### Last Workspace ### {{{
        ## Move to last workspace
        bindsym $mod+Tab workspace back_and_forth
        ## Send container to last workspace
        bindsym $mod+Shift+Tab move container to workspace back_and_forth
        ### End Last Workspace ### }}}

        ### Switch Workspace ### {{{
        ## switch to workspace
        bindsym $mod+1 workspace $ws1
        bindsym $mod+2 workspace $ws2
        bindsym $mod+3 workspace $ws3
        bindsym $mod+4 workspace $ws4
        bindsym $mod+5 workspace $ws5
        bindsym $mod+6 workspace $ws6
        bindsym $mod+7 workspace $ws7
        bindsym $mod+8 workspace $ws8
        bindsym $mod+9 workspace $ws9
        bindsym $mod+0 workspace $ws10
        ### End Switch Workspace ### }}}

        ### Send Workspace ### {{{
        ## move focused container to workspace
        bindsym $mod+Shift+1 move container to workspace $ws1
        bindsym $mod+Shift+2 move container to workspace $ws2
        bindsym $mod+Shift+3 move container to workspace $ws3
        bindsym $mod+Shift+4 move container to workspace $ws4
        bindsym $mod+Shift+5 move container to workspace $ws5
        bindsym $mod+Shift+6 move container to workspace $ws6
        bindsym $mod+Shift+7 move container to workspace $ws7
        bindsym $mod+Shift+8 move container to workspace $ws8
        bindsym $mod+Shift+9 move container to workspace $ws9
        bindsym $mod+Shift+0 move container to workspace $ws10
        ### End Send Workspace ### }}}

        ### Move Workspace Different Monitor ### {{{
        ## Move the current workspace to the next output
        bindsym $mod+Mod1+Left move workspace to output Left
        bindsym $mod+Mod1+Down move workspace to output Down
        bindsym $mod+Mod1+Up move workspace to output Up
        bindsym $mod+Mod1+Right move workspace to output right
        ### End Move Workspace Different Monitor ### }}}

        ### Cycle Through Workspaces ### {{{
        ## Added for touchegg
        bindsym $mod+u workspace prev
        bindsym $mod+o workspace next
        ### End Cycle Through Workspaces ### }}}
    ### End Workspace Bindings ### }}}

    ### Window Bindings ### {{{
        ## kill focused window
        bindsym $mod+Shift+q kill

        ### Sticky Windows, good for picture in picture (shows floating window on all workspaces)
        bindsym $mod+Shift+s sticky toggle

        ### Split Orientation ### {{{
        ## split in horizontal orientation
        bindsym $mod+h split h

        ## split in vertical orientation
        bindsym $mod+v split v
        ### End Split Orientation ### }}}
    ### End Window Bindings ### }}}

    ### Focus Bindings ### {{{
        ## enter fullscreen mode for the focused container
        bindsym $mod+f fullscreen toggle
        ## enter fullscreen mode over all monitors
        bindsym $mod+Shift+f fullscreen toggle global

        ### Tile / Float ### {{{
        ## toggle tiling / floating
        bindsym $mod+Shift+space floating toggle

        ## change focus between tiling / floating windows
        bindsym $mod+space focus mode_toggle
        ### End Tile / Float ### }}}

        ### Change Focus ### {{{
        ## change focus
        bindsym $mod+j focus left
        bindsym $mod+k focus down
        bindsym $mod+l focus up
        bindsym $mod+semicolon focus right

        ## alternatively, you can use the cursor keys:
        bindsym $mod+Left focus left
        bindsym $mod+Down focus down
        bindsym $mod+Up focus up
        bindsym $mod+Right focus right
        ### End Change Focus ### }}}

        ### Move Focused Window ### {{{
        ## move focused window
        bindsym $mod+Shift+j move left
        bindsym $mod+Shift+k move down
        bindsym $mod+Shift+l move up
        bindsym $mod+Shift+semicolon move right

        ## alternatively, you can use the cursor keys:
        bindsym $mod+Shift+Left move left
        bindsym $mod+Shift+Down move down
        bindsym $mod+Shift+Up move up
        bindsym $mod+Shift+Right move right
        ### End Move Focused Window ### }}}

        ### Focus Urgent Workspace {{{
        bindsym $mod+x [urgent=latest] focus
        ### End Focus Urgent Workspace ###}}}
    ### End Focus Bindings ### }}}

    ### Container Bindings ### {{{
        ### Change Container Layout ### {{{
        ## change container layout (stacked, tabbed, toggle split)
        bindsym $mod+s layout stacking
        bindsym $mod+w layout tabbed
        bindsym $mod+e layout toggle split
        ### End Change Container Layout ### }}}

        ### Parent / Child Container ### {{{
        ## focus the parent container
        bindsym $mod+a focus parent

        ## focus the child container
        bindsym $mod+d focus child
        ### End Parent / Child Container ### }}}
    ### End Container Bindings ### }}}

    ### Mouse Bindings ### {{{
        ## Use Mouse+$mod to drag floating windows to their wanted position
        floating_modifier $mod

        ## Seems like this only works on border or title bar...
        #bindsym --whole-window --border button6 workspace prev
        #bindsym --whole-window --border button7 workspace next
        ## Removed --whole-window as it started working, and touchpoint scrolling affected.
        bindsym --border button6 workspace prev
        bindsym --border button7 workspace next
    ### End Mouse Bindings ### }}}

    ### Scratch Pad ### {{{
    ## Make the currently focused window a scratchpad
    bindsym $mod+Shift+minus move scratchpad

    ## Show the first scratchpad window
    bindsym $mod+minus scratchpad show
    ### End Scratch Pad ### }}}

    ### User Interface Bindings ### {{{
        ### Brightness Bindings ### {{{
        bindsym XF86MonBrightnessUp exec xbacklight -inc 5          ## Increase screen brightness
        bindsym Shift+XF86MonBrightnessUp exec xbacklight -inc 1    ## Fine increase screen brightness
        bindsym XF86MonBrightnessDown exec xbacklight -dec 5        ## Decrease screen brightness
        bindsym Shift+XF86MonBrightnessDown exec xbacklight -dec 1  ## Fine decrease screen brightness
        bindsym $mod+XF86MonBrightnessUp exec xbacklight -set 100   ## Set max screen brightness
        bindsym $mod+XF86MonBrightnessDown exec xbacklight -set 1   ## Set min screen brightness
        ### End Brightness Bindings ### }}}

        ### Pulse Audio Controls ### {{{
        ## Softvol increase possible with pactl
        ## NOTE: due to HDMI output connect/disconnects causing sink number changes, sink '0' is now <strike>a command substitution<strike> @DEFAULT_SINK@
        ## NOTE: My thinkpad usb c gen 2 dock needs something to run the following to update the default sink:
        ##       pactl set-default-sink $(pactl list short sinks | awk '/RUNNING/ {print $1}')
        bindsym XF86AudioRaiseVolume exec --no-startup-id pactl set-sink-volume @DEFAULT_SINK@ +5%          ## Increase sound volume
        bindsym Shift+XF86AudioRaiseVolume exec --no-startup-id pactl set-sink-volume @DEFAULT_SINK@ +1%    ## Fine increase sound volume
        bindsym $mod+XF86AudioRaiseVolume exec --no-startup-id pactl set-sink-volume @DEFAULT_SINK@ 100%    ## Set volume to "100%"
        bindsym XF86AudioLowerVolume exec --no-startup-id pactl set-sink-volume @DEFAULT_SINK@ -5%          ## Decrease sound volume
        bindsym Shift+XF86AudioLowerVolume exec --no-startup-id pactl set-sink-volume @DEFAULT_SINK@ -1%    ## Fine decrease sound volume
        bindsym $mod+XF86AudioLowerVolume exec --no-startup-id pactl set-sink-volume @DEFAULT_SINK@ 50%     ## Set volume to "50%"

        bindsym XF86AudioMute exec --no-startup-id pactl set-sink-mute @DEFAULT_SINK@ toggle                ## Mute sound
        bindsym XF86AudioMicMute exec --no-startup-id pactl set-source-mute @DEFAULT_SOURCE@ toggle         ## Toggle default mic mute
        bindsym $mod+XF86AudioMicMute exec --no-startup-id pactl list short sources | awk '/input.*RUNNING/ {system("pactl set-source-mute " $1 " toggle")}'     ## Find and mute mics

        ## push to talk
        bindsym $mod+z exec --no-startup-id pactl set-source-mute @DEFAULT_SOURCE@ 0                        ## Hold to talk
        bindsym --release $mod+z exec --no-startup-id pactl set-source-mute @DEFAULT_SOURCE@ 1              ## Release to mute
        bindsym $mod+Shift+z exec --no-startup-id pactl set-source-mute @DEFAULT_SOURCE@ 0                  ## Unmute
        bindsym XF86PickupPhone exec --no-startup-id pactl set-source-mute @DEFAULT_SOURCE@ 0               ## Hold to talk
        bindsym --release XF86PickupPhone exec --no-startup-id pactl set-source-mute @DEFAULT_SOURCE@ 1     ## Release to mute
        bindsym XF86Go exec --no-startup-id pactl set-source-mute @DEFAULT_SOURCE@ 0                        ## Hold to talk, x1carb11
        bindsym --release XF86Go exec --no-startup-id pactl set-source-mute @DEFAULT_SOURCE@ 1              ## Release to mute, x1carb11
        ### End Pulse Audio ### }}}

        ### Toggle redshift ### {{{
        bindsym $mod+slash exec --no-startup-id pkill -USR1 redshift
        ### End Toggle redshift ### }}}
    ### End User Interface Bindings ### }}}

    ### Program Call Bindings ### {{{
        ### Launch Term ### {{{
        ## start a terminal
        bindsym $mod+Return exec kitty
        ## Backup term of urxvt
        bindsym $mod+Shift+Return exec urxvt
        ## Emergency backup term
        bindsym $mod++mod1+Return exec i3-sensible-terminal
        ### End Launch Term ### }}}

        ### Screen Shots ### {{{
        bindsym $mod+Home exec --no-startup-id exec scrot -m -F '%Y%m%d-%H%M%S_$wx$h_screen.png' -e 'mv $f ~/temp/'         ## Backup binding
        bindsym Print exec --no-startup-id exec scrot -m -F '%Y%m%d-%H%M%S_$wx$h_screen.png' -e 'mv $f ~/temp/'
        #bindsym XF86Explorer exec --no-startup-id exec scrot -m -F '%Y%m%d-%H%M%S_$wx$h_screen.png' -e 'mv $f ~/temp/'      ## x260
        #bindsym XF86Favorites exec --no-startup-id exec scrot -m -F '%Y%m%d-%H%M%S_$wx$h_screen.png' -e 'mv $f ~/temp/'     ## x270
        bindsym XF86Display exec --no-startup-id exec scrot -m -F '%Y%m%d-%H%M%S_$wx$h_screen.png' -e 'mv $f ~/temp/'       ## xnano
        bindsym XF86Mail exec --no-startup-id exec scrot -m -F '%Y%m%d-%H%M%S_$wx$h_screen.png' -e 'mv $f ~/temp/'          ## sofle keyboard
        ## Note: you need to click on the window, after key combo, to capture it.
        ## Note: Needs to have startup ip, as interacts with GUI
        bindsym $mod+Shift+Home exec --no-startup-id scrot -s -F '%Y%m%d-%H%M%S_$wx$h_screen.png' -e 'mv $f ~/temp/'        ## Backup binding
        bindsym Shift+Print exec --no-startup-id scrot -s -F '%Y%m%d-%H%M%S_$wx$h_screen.png' -e 'mv $f ~/temp/'
        #bindsym Shift+XF86Explorer exec --no-startup-id scrot -s -F '%Y%m%d-%H%M%S_$wx$h_screen.png' -e 'mv $f ~/temp/'     ## x260
        #bindsym Shift+XF86Favorites exec --no-startup-id scrot -s -F '%Y%m%d-%H%M%S_$wx$h_screen.png' -e 'mv $f ~/temp/'    ## x270
        bindsym Shift+XF86Display exec --no-startup-id scrot -s -F '%Y%m%d-%H%M%S_$wx$h_screen.png' -e 'mv $f ~/temp/'      ## xnano
        bindsym Shift+XF86Mail exec --no-startup-id scrot -s -F '%Y%m%d-%H%M%S_$wx$h_screen.png' -e 'mv $f ~/temp/'         ## sofle keyboard
        bindsym Control+XF86Mail exec --no-startup-id scrot -s -F '%Y%m%d-%H%M%S_$wx$h_screen.png' -e 'mv $f ~/temp/'       ## sofle keyboard
        ### End Screen Shots ### }}}

        ### Rofi Bindings ### {{{
        ## Use rofi, it's better
        ## start dmenu (a program launcher)
        #bindsym $mod+d exec dmenu_run
        bindsym $mod+p exec rofi -show run
        bindsym XF86Search exec rofi -show run      ## sofle keyboard

        ### rofi-pass binding
        bindsym $mod+Shift+p exec rofi-pass
        bindsym Shift+XF86Search exec rofi-pass     ## sofle keyboard
        bindsym Control+XF86Search exec rofi-pass   ## sofle keyboard
        ### End Rofi Bindings ### }}}

        ### External IP Toggle For i3 polybar ### {{{
        ## awk -v TEMP=/tmp/i3_polybar_ip_toggle_${USER} 'BEGIN {{FILE=getline < TEMP < 0 ? "0" : "1"} {if($0==1){STATE=1} else {STATE=0}} {if(STATE==0){system("echo 1 > "TEMP)} else {system("echo 0 > "TEMP)}} }'
        #bindsym XF86LaunchA exec awk -v TEMP=/tmp/i3_polybar_ip_toggle_${USER} 'BEGIN {{FILE=getline < TEMP < 0 ? "0" : "1"} {if($0==1){STATE=1} else {STATE=0}} {if(STATE==0){system("echo 1 > "TEMP)} else {system("echo 0 > "TEMP)}} }'    ## x260
        #bindsym XF86Display exec awk -v TEMP=/tmp/i3_polybar_ip_toggle_${USER} 'BEGIN {{FILE=getline < TEMP < 0 ? "0" : "1"} {if($0==1){STATE=1} else {STATE=0}} {if(STATE==0){system("echo 1 > "TEMP)} else {system("echo 0 > "TEMP)}} }'    ## x270
        ### End External IP For i3 polybar ### }}}

        ### Clipster Clipboard Manager ### {{{
        bindsym $mod+c exec clipster -sc
        ### End Clipster ### }}}
    ### End Program Call Bindings ### }}}

    ### Misc Bindings ### {{{
    ### End Misc Bindings ### }}}
### End Bindings ### }}}

### i3 Modes ### {{{
    ### System Control  Mode ### {{{
    mode "system-control" {
        bindsym l exec --no-startup-id $Locker, mode "default"
        bindsym e exec --no-startup-id i3-msg exit, mode "default"
        bindsym s exec --no-startup-id $Locker && systemctl suspend, mode "default"
        bindsym h exec --no-startup-id $Locker && systemctl hibernate, mode "default"
        bindsym r exec --no-startup-id systemctl reboot, mode "default"
        bindsym Shift+s exec --no-startup-id systemctl poweroff -i, mode "default"
        bindsym c exec --no-startup-id sudo /usr/bin/tomb close all, mode "default"
        bindsym Shift+c exec --no-startup-id sudo /usr/bin/tomb slam, mode "default"
        ## Invert screen colors
        bindsym i exec --no-startup-id xcalib -invert -alter, mode "default"
        ## Set brightness to my default of 30%
        bindsym b exec --no-startup-id xbacklight -set 30, mode "default"
        ## One minute timer, big
        bindsym t exec urxvt -fn xft:PragmataProMono-Regular:pixelsize=70 -e termdown -WBb -c 10 -t TIME 1m, mode "default"
        ## One minute timer, small
        bindsym Shift+t exec urxvt -e termdown -WBb -c 10 -t TIME 1m, mode "default"
        ## Flip screen horizontally
        bindsym f exec --no-startup-id xrandr -x, mode "default"
        ## Flip screen vertically
        bindsym Shift+F exec --no-startup-id xrandr -y, mode "default"
        ## Toggle between $TZ and UTC in polybar
        bindsym u exec awk -v TEMP=/tmp/i3_polybar_utc_${USER} 'BEGIN {{FILE=getline < TEMP < 0 ? "0" : "1"} {if($0==1){STATE=1} else {STATE=0}} {if(STATE==0){system("echo 1 > "TEMP)} else {system("echo 0 > "TEMP)}} }', mode "default"
        ## Unload gpg keys
        bindsym g exec --no-startup-id gpgconf --kill gpg-agent, mode "default"
        ## Reload polybar
        bindsym k exec --no-startup-id "$HOME/.config/polybar/scripts/start_polybar.sh", mode "default"
        ## Toggle xss-lock, used for lock on idle
        bindsym Shift+l exec --no-startup-id "$HOME/projects/personal/scripts/toggler.sh xss-lock", mode "default"
        ## Toggle screen off on idle
        bindsym p exec --no-startup-id "$HOME/projects/personal/scripts/toggler.sh powersave", mode "default"
        bindsym --release Shift+x exec "xkill", mode "default"

        ## back to normal: Enter or Escape
        bindsym Return mode "default"
        bindsym Escape mode "default"
    }

    bindsym $mod+Pause mode "system-control"
    bindsym $mod+End mode "system-control"
    ## x270
    #bindsym XF86Tools mode "system-control"
    ## x1nano and sofle keyboard
    bindsym XF86Favorites mode "system-control"
    ### End System Control Mode ### }}}

    ### App Quick Launch ### {{{
    ## Launch mode, one app per key.
    mode "quick-launch" {
        bindsym a exec pavucontrol ; mode "default"
        bindsym b exec qutebrowser ; mode "default"
        bindsym c exec speedcrunch ; mode "default"
        bindsym f exec firefox ; mode "default"
        ## gksudo is dead
        #bindsym g exec gksudo gameconqueror ; mode "default"
        bindsym g exec urxvt -e sudo scanmem ; mode "default"
        bindsym Shift+m exec --no-startup-id sudo /usr/bin/tomb open -k ~/vault.tomb.key ~/vault.tomb -g ; mode "default"
        ## Handles tv3 python3 version too
        #bindsym n exec urxvt --title terminal_velocity -e sh -c "terminal_velocity || $HOME/.local/bin/tv3" ; mode "default"
        bindsym n exec urxvt --title terminal_notes -e sh -c "note" ; mode "default"
        bindsym o exec libreoffice ; mode "default"
        bindsym t exec i3-sensible-terminal ; mode "default"
        bindsym v exec $HOME/bin/start-vpn.sh ; mode "default"
        bindsym w exec urxvt -e connman-ncurses ; mode "default"

        ## Keeping this as an example
        ## gnome-disks will not launch twice, gparted will. Avoid that.
        #bindsym d exec ((pidof gpartedbin) || gksudo gparted); exec gnome-disks ; mode "default"

        bindsym Return mode "default"
        bindsym Escape mode "default"
    }

    #bindsym $mod+Shift+g mode "quick-launch"
    bindsym $mod+g mode "quick-launch"
    ### End App Quick Launch ### }}}

    ### App Focus Mode ### {{{
    mode "app-focus" {
        ## hardcoded focus keybindings
        bindsym b [class="(?i)qutebrowser"] focus, mode "default"
        bindsym w [class="(?i)terminal" title="weechat"] focus, mode "default"
        #bindsym m [class="(?i)icedove"] focus, mode "default"
        #bindsym f [class="(?i)spacefm"] focus, mode "default"
        bindsym z [class="(?i)zathura"] focus, mode "default"

        ## back to normal: Enter or Escape
        bindsym Return mode "default"
        bindsym Escape mode "default"
    }

    bindsym $mod+Shift+g mode "app-focus"
    ### End App Focus Mode ### }}}

    ### Resize Window Mode ### {{{
    ## resize window (you can also use the mouse for that)
    mode "resize" {
        ## These bindings trigger as soon as you enter the resize mode

        ## They resize the border in the direction you pressed, e.g.
        ## when pressing left, the window is resized so that it has
        ## more space on its left
        bindsym h resize shrink left 10 px or 10 ppt
        bindsym j resize shrink down 10 px or 10 ppt
        bindsym k resize shrink up 10 px or 10 ppt
        bindsym l resize shrink right 10 px or 10 ppt
        bindsym Shift+H resize grow left 10 px or 10 ppt
        bindsym Shift+J resize grow down 10 px or 10 ppt
        bindsym Shift+K resize grow up 10 px or 10 ppt
        bindsym Shift+L resize grow right 10 px or 10 ppt

        ## Same bindings, but for the arrow keys
        bindsym Left resize shrink left 10 px or 10 ppt
        bindsym Down resize shrink down 10 px or 10 ppt
        bindsym Up resize shrink up 10 px or 10 ppt
        bindsym Right resize shrink right 10 px or 10 ppt
        bindsym Shift+Left resize grow left 10 px or 10 ppt
        bindsym Shift+Down resize grow down 10 px or 10 ppt
        bindsym Shift+Up resize grow up 10 px or 10 ppt
        bindsym Shift+Right resize grow right 10 px or 10 ppt

        ## Go to precise mode
        bindsym p mode "resize_precise"

        ## Back to normal: Enter or Escape
        bindsym Return mode "default"
        bindsym Escape mode "default"
    }

        ### Precise Resize ### {{{
        mode "resize_precise" {
            bindsym h resize shrink left 1 px or 1 ppt
            bindsym j resize shrink down 1 px or 1 ppt
            bindsym k resize shrink up 1 px or 1 ppt
            bindsym l resize shrink right 1 px or 1 ppt
            bindsym Shift+H resize grow left 1 px or 1 ppt
            bindsym Shift+J resize grow down 1 px or 1 ppt
            bindsym Shift+K resize grow up 1 px or 1 ppt
            bindsym Shift+L resize grow right 1 px or 1 ppt

            ## Same bindings, but for the arrow keys
            bindsym Left resize shrink left 1 px or 1 ppt
            bindsym Down resize shrink down 1 px or 1 ppt
            bindsym Up resize shrink up 1 px or 1 ppt
            bindsym Right resize shrink right 1 px or 1 ppt
            bindsym Shift+Left resize grow left 1 px or 1 ppt
            bindsym Shift+Down resize grow down 1 px or 1 ppt
            bindsym Shift+Up resize grow up 1 px or 1 ppt
            bindsym Shift+Right resize grow right 1 px or 1 ppt

            ## Return to normal resize
            bindsym p mode "resize"

            ## Back to normal: Enter or Escape
            bindsym Return mode "default"
            bindsym Escape mode "default"
        }
        ### End Precise Resize ### }}}

    bindsym $mod+r mode "resize"
    ### End Resize Mode ### }}}

    ### Control playerctl Mode ### {{{
    mode "control-playerctl" {
        bindsym space exec --no-startup-id playerctl --ignore-player=firefox,chromium play-pause, mode "default"
        bindsym p exec --no-startup-id playerctl --ignore-player=firefox,chromium play, mode "default"
        bindsym s exec --no-startup-id playerctl --ignore-player=firefox,chromium stop, mode "default"
        bindsym q exec --no-startup-id playerctl --ignore-player=firefox,chromium stop, mode "default"
        bindsym comma exec --no-startup-id playerctl --ignore-player=firefox,chromium previous, mode "default"
        bindsym period exec --no-startup-id playerctl --ignore-player=firefox,chromium next, mode "default"
        bindsym Shift+less exec --no-startup-id playerctl --ignore-player=firefox,chromium previous, mode "default"
        bindsym Shift+greater exec --no-startup-id playerctl --ignore-player=firefox,chromium next, mode "default"

        ## back to normal: Enter or Escape
        bindsym Return mode "default"
        bindsym Escape mode "default"
    }

    bindsym $mod+m mode "control-playerctl"
    ### End Control playerctl Mode ### }}}

    ### Control spotify via spotify-tui and spotifyd ### {{{
    #mode "control-spotify" {
        #bindsym p exec --no-startup-id spotify-tui playback --toggle, mode "default"
        #bindsym l exec --no-startup-id spotify-tui playback --like, mode "default"
        #bindsym r exec --no-startup-id spotify-tui playback --repeat, mode "default"
        #bindsym s exec --no-startup-id spotify-tui playback --shuffle, mode "default"

        #bindsym comma exec --no-startup-id spotify-tui playback --previous, mode "default"
        #bindsym period exec --no-startup-id spotify-tui playback --next, mode "default"
        #bindsym Shift+less exec --no-startup-id spotify-tui playback --previous, mode "default"
        #bindsym Shift+greater exec --no-startup-id spotify-tui playback --next, mode "default"

        ### back to normal: Enter or Escape
        #bindsym Return mode "default"
        #bindsym Escape mode "default"
    #}

    #bindsym $mod+m mode "control-spotify"
    ### End Control spotify via spotify-tui and spotifyd ### }}}

    ### Control Pianobar Mode ### {{{
    #mode "control-pianobar" {
        #bindsym p exec --no-startup-id ~/.config/pianobar/control-pianobar.sh play, mode "default"
        #bindsym q exec --no-startup-id ~/.config/pianobar/control-pianobar.sh quit, mode "default"
        #bindsym h exec --no-startup-id ~/.config/pianobar/control-pianobar.sh history, mode "default"
        #bindsym n exec --no-startup-id ~/.config/pianobar/control-pianobar.sh next, mode "default"
        #bindsym t exec --no-startup-id ~/.config/pianobar/control-pianobar.sh tired, mode "default"
        #bindsym s exec --no-startup-id ~/.config/pianobar/control-pianobar.sh switchstation, mode "default"
        #bindsym \, exec --no-startup-id ~/.config/pianobar/control-pianobar.sh previousstation, mode "default"
        #bindsym . exec --no-startup-id ~/.config/pianobar/control-pianobar.sh nextstation, mode "default"
        #bindsym l exec --no-startup-id ~/.config/pianobar/control-pianobar.sh love, mode "default"
        #bindsym b exec --no-startup-id ~/.config/pianobar/control-pianobar.sh ban, mode "default"
        #bindsym e exec --no-startup-id ~/.config/pianobar/control-pianobar.sh explain, mode "default"
        #bindsym c exec --no-startup-id ~/.config/pianobar/control-pianobar.sh current, mode "default"

        ### back to normal: Enter or Escape
        #bindsym Return mode "default"
        #bindsym Escape mode "default"
    #}

    #bindsym $mod+m mode "control-pianobar"
    ### End Control Pianobar Mode ### }}}

    ### Control mpd Mode ### {{{
    #mode "control-mpd" {
        #bindsym space exec --no-startup-id mpc -q toggle, mode "default"
        #bindsym p exec --no-startup-id mpc -q play, mode "default"
        #bindsym r exec --no-startup-id mpc -q random, mode "default"
        #bindsym s exec --no-startup-id mpc -q stop, mode "default"
        #bindsym q exec --no-startup-id mpc -q stop, mode "default"
        #bindsym comma exec --no-startup-id mpc -q prev, mode "default"
        #bindsym period exec --no-startup-id mpc -q next, mode "default"
        #bindsym Shift+less exec --no-startup-id mpc -q prev, mode "default"
        #bindsym Shift+greater exec --no-startup-id mpc -q next, mode "default"

        ### back to normal: Enter or Escape
        #bindsym Return mode "default"
        #bindsym Escape mode "default"
    #}

    #bindsym $mod+Shift+m mode "control-mpd"
    ### End Control mpd Mode ### }}}

    ## xrandr mode?
### End i3 Modes ### }}}

### Window Treatments ### {{{
    ## (adding "(?i)" means ignore case)
    ### Program Floating ### {{{
    for_window [class="mpv|feh|Pinentry|Gnome-calculator|Pavucontrol"] floating enable
    for_window [title="Steam - Update*|Steam - Self Updater|Event Tester|termdown"] floating enable

    ## Make wicd-curses and terminal_velocity pop up bigger, and centered
    ## Added second criteria to reduce false positives
    for_window [class="URxvt"] [title="wicd-curses|connman-ncurses|terminal_notes"] floating enable, resize set width 800px height 600px, move position center
    for_window [class="QtPass"] floating enable, resize set width 800px height 600px, move position center
    ### End Program Floating ### }}}

    ## Full screen
    for_window [title="ManaPlus"] fullscreen

    ## Disable border
    for_window [class="mpv|URxvt|kitty|(?i)chromium|terminator|qutebrowser|manaplus|(?i)firefox|(?)google-chrome"] border 1pixel

    ## Tab view
    for_window [class="Virt-manager"] focus child, layout tabbed, focus

    ## Move mpv podcast window to bottom right corner
    for_window [class="mpv"] [title="podcast"] move position 1550 800

    ### Deal with pop ups ### {{{
    for_window [window_role="pop-up"] floating enable
    for_window [window_role="task_dialog"] floating enable
    for_window [title="Preferences$"] floating enable
    ### End Popups ### }}}

    ### Scratchpad ### {{{
    #for_window [title="nvPY"] move scratchpad
    ### End Scratchpad ### }}}
### End Window Treatments ### }}}

### Assign Application Workspace ### {{{
#assign [class="(?i)spacefm"]    $ws7

### End Assign Application Workspace ### }}}

### Exec Programs ### {{{
## Start polybar
exec_always --no-startup-id $HOME/.config/polybar/scripts/start_polybar.sh
exec --no-startup-id [ "$(xrandr | grep -o eDP-1)" = "eDP-1" ] && xrandr --output eDP-1 --primary
## shift + numlock for mouse mode num pad, see https://linuxreviews.org/HOWTO_use_the_numeric_keyboard_keys_as_mouse_in_XOrg
#exec --no-startup-id setxkbmap -option keypad:pointerkeys
exec --no-startup-id [ -e $HOME/.Xmodmap ] && xmodmap $HOME/.Xmodmap
## Set pulseaudio bell sound, and set volume
exec --no-startup-id pactl upload-sample ~/.config/notice_beeps/tick.ogg bell && pactl load-module module-x11-bell sample=bell && xset b 75
exec --no-startup-id compton -b
## autorandr needs profiles already added
exec --no-startup-id srandrd autorandr
#exec --no-startup-id srandrd $HOME/projects/personal/scripts/hdmi_sound_toggle.sh
#exec --no-startup-id srandrd $HOME/.config/polybar/scripts/start_polybar.sh
#exec --no-startup-id srandrd $HOME/.config/conky/start_conky.sh
exec --no-startup-id nitrogen --restore
exec --no-startup-id xss-lock -l -- i3lock -fnec 2E3436
exec --no-startup-id udiskie
exec --no-startup-id redshift
exec --no-startup-id syncthing -no-browser
exec --no-startup-id touchegg
exec --no-startup-id unclutter
exec --no-startup-id clipster -d
## Note to self, removed hard coded ~/.mpd from mpd-dynamic
#exec --no-startup-id mpd && mpd-dynamic
exec --no-startup-id sleep 120 && spotifyd
#exec --no-startup-id i3-msg "workspace $ws7; exec /usr/bin/spacefm"
#exec --no-startup-id i3-msg "workspace $ws3; exec qutebrowser"
exec --no-startup-id i3-msg "workspace $ws1; exec kitty"
exec --no-startup-id sleep 30 && pkill -USR1 redshift
exec --no-startup-id sleep 15 && autorandr -c
exec --no-startup-id sleep 15 && $HOME/projects/personal/scripts/hdmi_sound_toggle.sh
exec --no-startup-id sleep 15 && $HOME/.config/conky/start_conky.sh
### End Exec Programs ### }}}
